vlabwikiaorg_ru-20200214-history
Симулятор роботов TeamBots
TeamBots - представляет собой программу моделирования мультиагентных (multi-agent) роботов, которая позволяет создавать мультиагентные системы управления в динамических средах с визуализацией. Вы можете разработать свою систему управления и реализовать ее в программе моделирования, а затем протестировать свою систему управления в реальном мобильном роботе (используя робота Nomadic Technologies Nomad 150). Автор программы Такер Балк. = Архитектура = thumb|right| 400px Интерфейс API программы TeamBots предусматривает абстрактный слой для системы управления (см. Рисунок 5). В результате чего, системе управления совершенно не важно, где именно ее запускают: в программе моделирования в искусственной среде (TBSim) или на платформе мобильного робота в реальной окружающей среде (TBHard). Среда моделирования TeamBots позволяет гибкую настройку и легкое построение искусственных сред с объектами и другими роботами. В ней просто добавлять стены, произвольные объекты, маршруты, а также добавлять других роботов, запущенных на той же или других системах управления. Таким образом, вы можете построить модели хищников (как один из примеров). Вместе с тем, объекты не обязательно должны быть статичными. Вы можете поместить объекты, которые могут двигаться по всей среде, или объекты, которые могут двигаться в случае, когда их толкнул робот (например, мяч). С помощью TeamBots вы можете создавать модели роботов различных типов. = Инсталляция симулятора (TBSim) = # Скачать дистрибутив TeamBots можно здесь. # Нужно установить Яву (Java) - ее можно скачать здесь или здесь. # Создаем отдельный каталог, например, c:\Simulator # туда копируем одну из готовых сред, например, директорию Walls из TeamBots\Domains\Walls # внутрь Walls копируем директорию TBSim из TeamBots\src\TBSim - собственно симулятор # внутрь Walls копируем директорию EDU из TeamBots\src\EDU - ??? # выполняем demo.bat # учимся создавать свои среды и агентов Простейшая среда "Препятствия" (Walls) thumb|right| 400px Запуск среды запускается следующей командной строкой: java TBSim.TBSim walls.dsc (содержимое demo.bat) #java - вызов интерпретатора явы #TBSim.TBSim - в дериктории TBSim запускаем явовский слинкованный класс TBSim.class #walls.dsc - .ini файл содержит инструкции для симулятора Содержимое walls.dsc windowsize 600 300 // размер окна в пикселях // = // Границы среды (SIMULATION BOUNDARY) // = // Установка границ видимой "игровой площадки" в метрах для моделирования. // Если эта "игровая площадка" не помещается в размеры окна, то // роботы может блуждать за экраном. bounds -5 15 -5 5 // размер среды в логических координатах (слева справа снизу сверху) seed 3 time 10.0 maxtimestep 100 background xFFFFFF // Квадратик ? // xp - x координата. // yp - y координата. // t - ingored. // r - радиус. // f - the foreground color. // b - ignored. // v - the vision class. ??? // i - the unique id. почему то не задается // s - random number seed. почему то не задается object EDU.gatech.cc.is.simulation.BinSim 10 0 0 0.50 x0000BB x000000 4 robot EDU.gatech.cc.is.abstractrobot.MultiForageN150Sim SchemaDemo 0 0 0 x000000 xFF0000 2 // obstacles object EDU.gatech.cc.is.simulation.ObstacleSim 10.0 1.0 0 0.30 xC0C0C0 x000000 2 // walls linearobject EDU.cmu.cs.coral.simulation.LinearObstacleSim -4 1 5 1 0.2 xC0C0C0 x000000 2 linearobject EDU.cmu.cs.coral.simulation.LinearObstacleSim -4 -1 5 -1 0.2 xC0C0C0 x000000 2 //linearobject EDU.cmu.cs.coral.simulation.LinearObstacleSim 6 -1 8 1 0.2 xC0C0C0 x000000 2 object EDU.cmu.cs.coral.simulation.PolygonObstacleSim 7.0 -1.0 0.7 1.0 xC0C0C0 x000000 2 Класс SchemaDemo import EDU.gatech.cc.is.util.Vec2; import EDU.gatech.cc.is.abstractrobot.*; import EDU.gatech.cc.is.clay.*; /** * Demonstrates navigation with a few motor schemas: move-to-goal, * noise, and avoid-obstacle. * * ©1999, 2000 Tucker Balch, Georgia Tech Research Corporation and CMU. */ // ControlSystemMFN150 - Этот класс обеспечивает систему управления роботом MultiForageN150 // Наследуемся от него, чтобы несколько модифицировать поведение робота // When you create a contol system by extending this class, it can run within JavaBotHard to control a real robot or JavaBotSim in simulation. public class SchemaDemo extends ControlSystemMFN150 { public final static boolean DEBUG = true; private NodeVec2 turret_configuration; private NodeVec2 steering_configuration; private double mtggain = 1.0; private double oldmtggain = 1.0; private double avoidgain = 0.8; private double oldavoidgain = 0.8; private double noisegain = 0.2; private double oldnoisegain = 0.2; // Переопределите этот метод, для конфигурирования вашей управляющей системы public void configure() { // Vec2 - A class for manipulating 2d vectors. Both polar and cartesian components are // always available. The fields x, y, t (theta) and r are directly available for reading, // but you should never set them directly. Use setx, sety, sett and setr instead. This // (non OO) approach was chosen deliberately for speed reasons; no whining. // +x is right, +y is up. t is in radians with t=0 in the +x direction and t = PI // in the -r direction, increasing CCW. // NOTE: Vec2's can have direction without magnitude, i.e. theta has meaning even // if x, y and r 0. Vec2 a; Vec2 b; a = new Vec2(0,0); b = new Vec2(a); System.out.println("before "+b.x); a.setx(1); System.out.println("after "+b.x); System.out.println("after "+a.x); // = // Конфигурация "железа" // = // abstract_robot - робот, который присоединен к этой системе управления //setObstacleMaxRange - Set the maximum range at which a sensor reading should //be considered an obstacle. Beyond this range, the readings are ignored. //The default range on startup is 1 meter. abstract_robot.setObstacleMaxRange(3.0); // don't consider // things further away //setBaseSpeed - Set the base speed for the robot (translation) in meters per second. //Base speed is how fast the robot will move when setSpeed(1.0) is called. The speed must //be between 0 and MAX_TRANSLATION. It will be clipped to whichever limit it exceeds. abstract_robot.setBaseSpeed(0.4*abstract_robot.MAX_TRANSLATION); // = // perceptual schemas // = //--- robot's global position //Класс NodeVec2 - A Node that returns Vec2 values - узел, который содержит значение класса Vec2 (?) //Класс v_GlobalPosition_r - Report a Vec2 representing the robot's position in global coordinates //v_GlobalPosition_r(SimpleInterface ar) - Instantiate a v_GlobalPosition_r schema. //SimpleInterface - интерфейс (см. ниже) NodeVec2 PS_GLOBAL_POS = new v_GlobalPosition_r(abstract_robot); //--- Сканирование локатором препятствий //va_Obstacles_r - Report a list of Vec2s pointing to obstacles detected by the robot. // PS_OBS - список векторов, где обнаруженно препятствие NodeVec2Array PS_OBS = new va_Obstacles_r(abstract_robot); // v_FixedPoint_ - используется при движении к известному положению // PS_HOMEBASE_GLOBAL - расположение цели NodeVec2 PS_HOMEBASE_GLOBAL = new v_FixedPoint_(10.0,0.0); // Convert a global Vec2 to egocentric coordinates based on the positional // information provided by a SimpleInterface robot. NodeVec2 PS_HOMEBASE = new v_GlobalToEgo_rv(abstract_robot, PS_HOMEBASE_GLOBAL); // = // Схема мотора (This software module is based on the motor schema formulation // developed by Ronald C. Arkin) // = // Избегание препятствий // v_Avoid_va - This node (motor schema) generates a vector away from the items detected by // its embedded perceptual schema. Magnitude varies from 0 to 1. This version works differently // than Arkin's original formulation. In the original, a repulsion vector is computed for each // detected obstacle, with the result being the sum of these vectors. The impact is that several // hazards grouped closely together are more repulsive than a single hazard. This causes problems // when each sonar return is treated as a separate hazard --- walls for instance are more // repulsive than a small hazard. This version computes the direction of the repulsive vector as // in the original, but the returned magnitude is the largest of the vectors, not the sum. // Конструктор // public v_Avoid_va(double soe, double s, NodeVec2Array im1) // soe - double, the sphere of influence beyond which the hazards are not considered. // s - double, the safety zone, inside of which a maximum repulsion from the object is generated. // im1 - NodeVec2Array, the embedded node that generates a list of items to avoid. NodeVec2 MS_AVOID_OBSTACLES = new v_Avoid_va(3.0, abstract_robot.RADIUS + 0.1, PS_OBS); // Движение к цели // v_LinearAttraction_v - Generates a vector towards a goal location that varies with distance // from the goal. The attraction is increased linearly at greater distances. NodeVec2 MS_MOVE_TO_HOMEBASE = new v_LinearAttraction_v(0.4,0.0,PS_HOMEBASE); // Вектор шума (?) // v_Noise_ - Generates a vector in a random direction for a specified time. NodeVec2 MS_NOISE_VECTOR = new v_Noise_(10,5); // = // AS_GO_HOME // = // v_StaticWeightedSum_va - Combine an array of embedded schemas using static weights set // at configuration time. Configuration is done by setting the values of the embedded[] // and weights[] arrays. v_StaticWeightedSum_va AS_GO_HOME = new v_StaticWeightedSum_va(); AS_GO_HOME.weights0 = avoidgain; AS_GO_HOME.embedded0 = MS_AVOID_OBSTACLES; AS_GO_HOME.weights1 = noisegain; AS_GO_HOME.embedded1 = MS_NOISE_VECTOR; AS_GO_HOME.weights2 = mtggain; AS_GO_HOME.embedded2 = MS_MOVE_TO_HOMEBASE; turret_configuration = AS_GO_HOME; steering_configuration = AS_GO_HOME; } /** * Called every timestep to allow the control system to * run. */ public int takeStep() { Vec2 result; double dresult; long curr_time = abstract_robot.getTime(); Vec2 p; // Управление основанием // Получить значение вектора от узла steering_configuration на момент curr_time (текущие время) result = steering_configuration.Value(curr_time); // public void setSteerHeading(long timestamp, double heading) - // Set the desired heading for the steering motor. // Параметры: // heading - the heading in radians. // timestamp - only get new information if timestamp > than last call or timestamp -1. // Vec2.t - угол поворота в полярных координатах abstract_robot.setSteerHeading(curr_time, result.t); // public void setSpeed(long timestamp, double speed) // Set the desired speed for the robot (translation). The speed must be between 0 and 1; // where 0 is stopped and 1.0 is "full blast". It will be clipped to whichever limit it exceeds. // Also, underlying software will keep the actual speed at zero until the steering motor is // close to the desired heading. Use setBaseSpeed to adjust the top speed. // Параметры: // timestamp - only get new information if timestamp > than last call or timestamp -1. // speed - the desired speed from 0 to 1.0, where 1.0 is the base speed. // Vec2.r - радиус в полярных координатах abstract_robot.setSpeed(curr_time, result.r); // Управление "башенкой" // Получить значение вектора от узла turret_configuration на момент curr_time (текущие время) result = turret_configuration.Value(curr_time); // public void setTurretHeading(long timestamp, double heading) // Set the desired heading for the turret motor. // Параметры: // timestamp - only get new information if timestamp > than last call or timestamp -1. // heading - the heading in radians. abstract_robot.setTurretHeading(curr_time, result.t); // Установка строки состояния, которая отображается для робота. Для реального робота она // отображена на консоли, при моделировании она отображена рядом с агентом если выбрать // "Robot State". Параметр - текст для отображения. abstract_robot.setDisplayString("trying to go to the goal"); return(CSSTAT_OK); } } См. также * Симуляторы физики реального мира * Среда Город для симулятора TeamBots * interface SimpleInterface * class v_StaticWeightedSum_va * class v_Noise_ - генерация случайного вектора для движения * class v_LinearAttraction_v - генерация вектора для прямолинейного движения к цели * class v_Avoid_va - генерация вектора, который обходит обнаруженные препятствия *